package org.wdcode.common.codec;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.wdcode.common.constants.UnitConstants;
import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.params.WdCommonParams;
import org.wdcode.common.util.StringUtil;

/**
 * 加密解密基础类 内部使用
 * @author WD
 * @since JDK6
 * @version 1.0 2010-06-23
 */
abstract class BaseCrypt {
	// 加密KEY
	protected final static byte[]	KEY;
	// AES加密KEY
	protected final static int		AES_LENGTH;
	// DES加密KEY
	protected final static int		DES_LENGTH;
	// DES加密KEY
	protected final static int		RC4_LENGTH;
	// DES加密KEY
	protected final static int		RC2_LENGTH;

	// 静态初始化
	static {
		// 初始化加密KEY
		KEY = StringUtil.toBytes(Digest.md5Hex(WdCommonParams.getEncryptKey()));
		// 初始化AES
		AES_LENGTH = WdCommonParams.getEncryptKeyLengthAES() / UnitConstants.BYTE_BIT;
		// 初始化DES
		DES_LENGTH = WdCommonParams.getEncryptKeyLengthDES() / UnitConstants.BYTE_BIT;
		// 初始化RC2
		RC2_LENGTH = WdCommonParams.getEncryptKeyLengthRC2() / UnitConstants.BYTE_BIT;
		// 初始化RC4
		RC4_LENGTH = WdCommonParams.getEncryptKeyLengthRC4() / UnitConstants.BYTE_BIT;
	}

	/**
	 * 计算密文
	 * @param b 要计算的字节数组
	 * @param key 计算密钥Key 长度有限制 DSE 为8位 ASE 为16位
	 * @param offset 偏移从第几位开始
	 * @param len 长度一共几位
	 * @param algorithm 算法
	 * @param mode 计算模式 加密和解密
	 * @return 字节数组
	 */
	protected static byte[] doFinal(byte[] b, byte[] key, int offset, int len, String algorithm, int mode) {
		try {
			// 算法Key
			SecretKey skeySpec = new SecretKeySpec(key, offset, len, algorithm);
			// 算法操作
			Cipher cipher = Cipher.getInstance(algorithm);
			// 初始化
			cipher.init(mode, skeySpec);
			// 返回计算结果
			return cipher.doFinal(b);
		} catch (Exception e) {
			throw new CustomRuntimeException(e);
		}
	}
}
